home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-11-30 | 3.3 KB | 165 lines | [TEXT/MMCC] |
- /*
- File: LinkedList.cp
-
- Contains: A linked list
- Written by: Dave Mark
- Copyright: © 1994 by Dave Mark, all rights reserved.
- */
-
- #include "LinkedList.h"
- #include "Link.h"
-
-
- TLinkedList::TLinkedList()
- {
- fFirstLinkPtr = nil;
- fLastLinkPtr = nil;
- }
-
-
- TLinkedList::~TLinkedList()
- {
- DeleteAllLinks();
- }
-
-
- OSErr TLinkedList::CreateAndAddLink( void *objectPtr )
- {
- TLink *newLinkPtr;
-
- newLinkPtr = new TLink( objectPtr );
-
- if ( newLinkPtr == nil )
- return kLink_BadLinkErr;
-
- if ( fFirstLinkPtr == nil )
- fFirstLinkPtr = newLinkPtr;
-
- if ( fLastLinkPtr != nil )
- fLastLinkPtr->SetNextLink( newLinkPtr );
-
- newLinkPtr->SetPrevLink( fLastLinkPtr );
- newLinkPtr->SetNextLink( nil );
-
- fLastLinkPtr = newLinkPtr;
-
- return noErr;
- }
-
-
- OSErr TLinkedList::FindAndDeleteLink( void *objectPtr )
- {
- TLink *foundLinkPtr;
-
- foundLinkPtr = FindLink( objectPtr );
-
- if ( foundLinkPtr == nil )
- return kLinkedList_LinkNotFoundErr;
- else
- return DeleteLink( foundLinkPtr );
- }
-
-
- unsigned long TLinkedList::CountLinks()
- {
- TLink *currentLinkPtr;
- unsigned long numLinks;
-
- numLinks = 0;
- currentLinkPtr = fFirstLinkPtr;
-
- while ( currentLinkPtr != nil )
- {
- numLinks++;
- currentLinkPtr = currentLinkPtr->GetNextLink();
- }
-
- return numLinks;
- }
-
-
- void *TLinkedList::GetNthLinkObject( unsigned long linkIndex )
- {
- TLink *currentLinkPtr;
- unsigned long numLinks, curLinkIndex;
-
- numLinks = CountLinks();
-
- if ( (linkIndex < 1) || (linkIndex > numLinks) )
- return nil;
-
- curLinkIndex = 0;
- currentLinkPtr = fFirstLinkPtr;
-
- for ( curLinkIndex=1; curLinkIndex<linkIndex; curLinkIndex++ )
- currentLinkPtr = currentLinkPtr->GetNextLink();
-
- return currentLinkPtr->GetObjectPtr();
- }
-
-
- void TLinkedList::DeleteAllLinks() //Avoids overhead of repeated delete/repair list cycle...
- {
- TLink *currentLinkPtr, *nextLinkPtr;
-
- currentLinkPtr = fFirstLinkPtr;
-
- while ( currentLinkPtr != nil )
- {
- nextLinkPtr = currentLinkPtr->GetNextLink();
-
- delete currentLinkPtr;
-
- currentLinkPtr = nextLinkPtr;
- }
-
- fFirstLinkPtr = nil;
- fLastLinkPtr = nil;
- }
-
-
- TLink *TLinkedList::FindLink( void *objectPtr )
- {
- TLink *currentLinkPtr;
-
- currentLinkPtr = fFirstLinkPtr;
-
- while ( currentLinkPtr != nil )
- {
- if ( currentLinkPtr->GetObjectPtr() == objectPtr )
- return currentLinkPtr;
-
- currentLinkPtr = currentLinkPtr->GetNextLink();
- }
- return nil;
- }
-
-
- OSErr TLinkedList::DeleteLink( TLink *linkPtr )
- {
- // SPECIAL CASE: Tried to delete nil TLink...
- if ( linkPtr == nil )
- return kLinkedList_CouldNotDeleteLinkErr;
-
- // SPECIAL CASE: Tried to delete first TLink on list...
- // That means the fFirstLinkPtr needs to be fixed...
- if ( linkPtr == fFirstLinkPtr )
- fFirstLinkPtr = linkPtr->GetNextLink();
- // SPECIAL CASE: Tried to delete a link that wasn't first in the list...
- // That means that we need to set the previous link's
- // "next" pointer to point to the link after us...
- else
- linkPtr->GetPrevLink()->SetNextLink( linkPtr->GetNextLink() );
-
- // SPECIAL CASE: Tried to delete last TLink on list...
- // That means the fLastLinkPtr needs to be fixed...
- if ( linkPtr == fLastLinkPtr )
- fLastLinkPtr = linkPtr->GetPrevLink();
- // SPECIAL CASE: Tried to delete a link that wasn't last in the list...
- // That means that we need to set the next link's
- // "prev" pointer to point to the link before us...
- else
- linkPtr->GetNextLink()->SetPrevLink( linkPtr->GetPrevLink() );
-
- return noErr;
- }